AWS Key Management Service

  • Setiap kali mendengar istilah enkripsi pada AWS service, hampir pasti terkait dengan KMS
  • AWS mengelola key enkripsi
  • secara penuh terintegrasi dengan IAM untuk otorisasi
  • Cara paling mudah untuk mengendalikan akses ke data
  • Kelebihan menggunakan KMS:
    • dapat mengaudit setiap API call yang dibuat oleh key melalui CloudTrail
  • KMS terintegrasi dengan sebagian besar AWS Service
    • EBS
    • S3
    • RDS
    • SSM
  • Jika memiliki secret data, jangan pernah menyimpannya ke dalam plaintext, terutama ke dalam code
    • KMS dapat digunakan melalui API Call (SDK, CLI)
    • enkripsi secret yang disimpan di dalam code / environment variables

KMS Keys Types

  • KMS Keys merupakan nama baru dari KMS Customer Master Key
  • Terdapat dua jenis KMS Keys
    • Symmetric (AES-256 keys)
      • 1 encryption key yang digunakan untuk enkripsi dan dekripsi
      • AWS Service yang terintegrasi dengan KMS menggunakan symmetric key CMK
      • Anda tidak dapat mengakses KMS Key Unencrypted (harus memanggil KMS API untuk menggunakan key)
    • Asymmetric (RSA & ECC Key pairs)
      • Memiliki dua jenis key
        • public (encrypt)
        • private (decrypt)
      • Digunakan untuk operasi encrypt/decrypt atau sign/verify
      • public key dapat didownload namun private key tidak dapat diakses secara plain
      • use case :
        • enkripsi di luar AWS oleh user yang tidak dapat memanggil KMS API

Types of KMS Keys

  • Beberapa jenis KMS Keys
    • Customer Managed Keys
      • key yang langsung dibuat di KMS
      • User dapat mengelola : Create, manage and use ✅
      • Hanya digunakan untuk AWS Account yang bersangkutan ✅
      • Automatic rotation Optional (every 1 year) ✅
      • user dapat enable/disable
      • rotation policy dapat diatur
        • every year
        • old key preserved
      • Dapat menambahkan key policy (resource policy) dan audit di CloudTrail
      • menggunakan envelope encryption
    • AWS Managed Keys
      • digunakan secara eksklusif oleh AWS Service
        • aws/s3
        • aws/ebs
        • aws/redshit
      • User dapat view metada ✅
      • digunakan hanya pada AWS Account yang bersangkutan ✅
      • dikelola oleh AWS (secara otomatis rotated setiap 1 tahun)
        • user tidak dapat mengelola ❌
      • anda dapat melihat key policy dan melakukan audit pada CloudTrail
      • tidak dapat digunakan untuk operasi enkripsi diluar dari yang AWS lakukan
      • Automatic rotation :required ✅
    • AWS Owned Keys
      • dibuat dan dikelola oleh AWS digunakan oleh beberapa AWS service untuk melindungi resource
      • dapat digunakan oleh banyak AWS account, namun key tersebut digunakan secara internal
      • user tidak dapat view, use, track atau audit ❌
      • user tidak dapat mengelola key ❌
      • automatic rotation bervariasi

KMS Key Material Origin

  • Bagaimana me-create Key?
    • identifikasi source of the key material di KMS key
    • tidak dapat diubah setelah di-create (imutable)
  • Ada tiga origin :
    • KMS (AWS_KMS) - default
      • AWS KMS secara otomatis create, dan manage key material di dalam key store
      • jenis origin, jika user membuat key melalui menu KMS, kemudian pilih create key
    • External (EXTERNAL)
      • import key material dari luar
      • user bertanggung jawab mengelola dan mengamankan key material di luar AWS
    • Custom Key Store (AWS_CLOUDHSM)
      • AWS KMS membuat key material di custom key store (CloudHSM Cluster)

Custom Key Store (CloudHSM)

  • Integrasi KMS dengan CloudHSM cluster sebagai custom key store
    • key material disimpan di CloudHSM cluster (multi AZ) yang dimiliki dan dikelola sendiri
    • operasi kriptografi dilakukan di dalam HSM
  • Use case :
    • user menginginkan kendali langsung atas HSM
    • KMS key perlu disimpan pada dedicated HSM

External

  • user import key material-nya sendiri ke dalam KMS Key
    • Bring Your Own Key (BYOK)
  • user bertanggung jawab terhadap material key di luar AWS
    • security
    • availability
    • durability
  • Key haruslah 256-bit symmetric key (Asymmetric key tidak didukung)
  • tidak dapat menggunakan Custom Key Store (CloudHSM)
  • Rotate key dilakukan secara manual
    • automatic key rotation tidak didukung

Pricing

  • Pricing berdasakran Jenis key pada KMS Keys
    • AWS Owned Keys (free)
      • SSE-S3
      • SSE-SQS
      • SSE-DDB
    • AWS Managed Key (free)
      • aws/service-name
      • example:
        • aws/rds
        • aws/ebs
    • Customer managed keys, (created in KMS)
      • 1 usd/month
    • Customer managed keys, imported
      • haruslah symmetric key
      • 1 usd/month
  • Pricing untuk API call to KMS
    • 0.03 usd/10.000 calls
  • Terdapat fitur Automatic Key Rotation
    • AWS-managed KMS: otomatis rotasi tiap 1 tahun
    • Customer-managed KMS keys
      • harus diaktifikan
      • otomatis setiap 1 tahun
    • Imported KMS Key :
      • Hanya manual rotation yang dimungkinkan menggunakan alias

Copying Snapshot Across Region

  • KMS Key memiliki lingkup di satu region
  • Case :
    • terdapat EBS volume yang dienkripsi dengan KMS di region A
    • Enkripsi menggunakan KMS key A di region A
    • Jika EBS volume tersebut ingin dicopy ke region B. Beberapa langkah berikut harus dilakukan :
      • Buat EBS snapshot dari EBS volume.
      • jika snapshot dibuat dari EBS volume yang dienkripsi, maka snapshot tersebut juga akan terenkripsi
      • Untuk mengcopy ke region B. snapshot tersebut perlu di-dekrip menggunakan KMS Key A
      • Copy ke region B
      • Enkripsi ulang menggunakan KMS Key B di Region B
      • Create EBS volume di region B dari snapshot EBS

KMS Key Policies

  • KMS Key policies adalah cara untuk mengendalikan akses ke KMS Key
    • mirip dengan S3 Bucket policies, namun perbedaannya jika tidak ada KMS key policy pada KMS Key maka tidak ada user yang dapat mengakses KMS key tersebut
  • Dua jenis KMS Key Policy
    • Default KMS Key Policy
      • dibuat jika user tidak membuat specific KMS key policy
      • Default : mengijinkan semua orang di dalam account untuk dapat mengakses key
      • Digunakan jika anda memiliki IAM Policy yang mengijinkan semua user/role dapat mengakses key
    • Custom KMS Key policy
      • menetapkan user, role mana saja yang dapat mengakses KMS Key
      • define siapa yang mengadministrasi key
      • berguna untuk cross-account yang ingin mengakses KMS key

Copying Snapshots accross Keys

  1. Buat snapshot yang terenkripsi dengan menggunakan KMS Key (CMK) pada Account A
  2. Attach KMS Key policy untuk mengotorisasi cross-account access
{
	"Sid":"Allow use of the key with destination account",
	"Effect":"Allow",
	"Principal":{
		"AWS":"arn:aws"iam::xxx"
	},
	"Action":[
		"kms:Decrypt",
		"kms:CreateGrant"
	],
	"Resource":"*",
	"Condition":{
		"StringEquals": {
		"kms:viaService":"ec2.REGION.amazonaws.com",
		"kms:CallerAccount":"<TARGET-ACCOUNT-ID>"
		}
	}

}

  1. share snapshot yang terenkripsi tersebut
  2. Pada target account : buat copy dari snapshot pada point 3, dan enkripsi dengan CMK dari akun target
  3. Buat volume dari snapshot pada langkah 4

[Hands On] Create Key

//TODO

KMS Multi-Region Keys

  • Misal Primary Key pada region A, dan key ingin direplikasi ke region yang lain (region B, C, D)
    • key ID akan sama dengan primary key di region A (region asal)
  • Mengapa memerlukan Multi-Region Keys?
    • KMS key yangs ama di lintas region dapat digunakan bergantian pada region tersebut
    • misal, enkripsi di region A, dan ingin dienkripsi di region B
    • multi-region key memiliki :
      • key id yang sama
      • key material yang sama
      • automatic rotation
    • Tidak diperlukan untuk melakukan enkripsi ulang / memanggil API lintas region
    • KMS multi-Region tidak sama dengan global
      • user memiliki key primary (dari region asal)
      • dan key replika di region tujuan
      • setiap key multi-region dikelola secara independen
      • hanya satu key primary dalam satu waktu, replica key dapat dipromosikan menjadi primary key-nya sendiri
    • Tidak direkomendasikan menggunakan Multi-region key kecuali pada use case yang sangat spesifik
      • karena KMS key seharusnya terikat pada satu region
    • Use case :
      • global client-side encryption
      • encryption pada Global DynamoDB
      • Global Aurora
      • Disaster Recovery
      • Active-active application yang dideploy lintas region

DynamoDB Global Tables and KMS Multi-region Keys Client Side Encryption

  • Case : anda ingin melakukan enkripsi specific attribute client side pada DynamoDB table menggunakan klien enkripsi Amazon DynamoDB tertentu
    • Terdapat dua region A dan B
    • KMS Service pada region A memiliki MRK yang direplikasi ke region B
    • klien App ingin insert data ke aplikasi pada DynamoDB table di region A
      • enkripsi attribute dengan primary key menggunakan primary MRK -> dilakukan di client
      • konsepnya tidak semua attribute di dalam table dienkripsi, namun hanya attribute tertentu, misalnya NIK
      • Database administratorpun tidak dapat mengetahui NIK yang dienkripsi di dalam DynamoDB Table
      • Karena DynamoDB merupakan global table, data enkripsi client-side direplikasi di region B
      • jika menggunakan MRK, client di region B dapat menggunakan low latency API untuk memanggil KMS di region B untuk mendekripsi data client-side
      • Key di region A direplikasi ke region B

Global Aurora and KMS MRK Client-Side encryption

  • Konsepnya sama seperti sebelumnya
  • anda dapat mengkripsi attribute tertentu secara client-side pada Aurora Table menggunakan AWS Encryption SDK
  • Terdapat dua region,
    • Region A
      • KMS MRK -> direplikasi ke region B
    • Region B
      • KMS replicated from region A
  • Client App
    • melakukan enkripsi menggunakan primary MRK, request ke region A
    • encrypted attribute (1 kolom, misal NIK) di-insert ke table Aurora region A
  • karena Aurora merupakan Global Table, maka client-side encrypted data direplikasi ke region lain (region B)
  • Jika menggunakan MRK yang direplikasi pada region yang sama dengan Global Aurora DB (misal region B). App Client dapat menggunakan low-latency API call pada region B untuk dekripsi data di sisi client
  • Dengan menggunakan client-side encryption, kita dapat melindungi field tertentu dan memastikan hanya dapat didekripsi oleh client yang dapat mengakses API key. field tersebut tidak akan dapat diakses oleh siapapun bahkan oleh database admin.